Úvod


KAPITOLA 1

NA POČÁTKU CESTY

V první kapitole kurzu se seznámíme se základy práce v jazyce R. Ačkoliv nám znalosti zde získané nepřinesou okamžitý užitek (nenaučíme se tu pracovat s datovými soubory), je důležité ji absolvovat. Proto neztrácejme čas a vrhněme se společně do studia.

K tomu Vám přeji spoustu radosti při objevování tohoto kouzelného jazyka, během kterého společně procestujeme celý svět. Naše cesta začíná v místech, kam zabloudil Praotec Čech a končí až v daleké Coimbře, respektive v Katanu. Šťastnou cestu přátelé!

Několik poznámek před cestou

Zde vidíme cestu, která na nás čeká v následujících osmi kapitolách. Kapitoly jsou rozděleny do jednotlivých lekcí (respektive měst, např. Instalace, Cesta za RStudiem, Vektory atd., která jsou za sebou seřazena dle postupu studia). Ty jsou následně rozlišeny ve třech barvách (zelené, žluté a červené). Zelená barva je určena pro ty města, kterými jsme již prošli. Vzhledem k tomu, že se nacházíme na počátku cesty, není na mapě žádné město touto barvou zobrazeno. Druhá barva je žlutá. Ta zobrazuje dosud neprojité lekce aktuální kapitoly naší eRkové poutě. Jak je vidět, cílem první kapitoly je vydat se na cestu z Řípu až do portugalské Coimbry. Zbývající barvou je červená. Ta značí města, která na nás čekají v ostatních sedmi kapitolách.

Mapu si můžete přiblížit (oddálit) pomocí tlačítka plus (mínus) v levém rohu mapy, stejně jako ji roztáhnout na celé okno pomocí tlačítka s okénkem. Veškerá města po rozkliknutí jejich názvu (respektive po kliknutí bodu na mapě) poskytují přímý odkaz na danou lekci. Nyní však již dost povídání, jelikož nastává nejvyšší čas pustit se do instalace. Hodně štěstí!

Instalace

Column

Říp: Instalace

Ačkoliv bylo R původně naprogramováno v roce 1993 na Univerzitě v Aucklandu, my odstartujeme naši pouť u nás doma na vrcholku bájné hory Říp. Předtím než se ale pustíme do samotné práce, musíme R nejprve nainstalovat na svůj počítač či notebook. Nejedná se o nic složitého. Stačí postupovat podle následujícího návodu, který je rozdělen podle jednotlivých operačních systémů (Windows, MAC OS X a Linux).

Windows

Programovací jazyk R v současnosti nejaktuálnější verzi 4.0.0 si můžete zdarma stáhnout kliknutím na následující logo. Instalace není záludná, proto ji snad netřeba podrobně popisovat. Úvodní nastavení v rámci instalačního procesu nemusíme měnit.

Tím ale práce nekončí. Ke spokojenosti nám totiž bude scházet stáhnout tzv. vývojové prostředí pod názvem RStudio (je též zdarma), ve kterém budeme reálně pracovat. To nám práci s programovacím jazykem v mnohém velmi zjednoduší a po uživatelské stránce zpříjemní. Práce v R bez RStudia není příliš přívětivá. Rozdíl tu naleznete jako mezi Favoritem a novým Porsche. Obě auta Vás s jistou dávkou pravděpodobnosti sice dovezou do kýženého cíle, kvalita jízdy však bude nesrovnatelná. Na druhé straně nesmíme zapomenout, že RStudio bez nainstalovaného R bude fungovat obdobně jako auto bez benzínu. Jinými slovy R bez RStudia spustit lze, opačně ale nikoliv.

Jak pevně doufám, vše je nainstalováno a již se určitě nemůžete dočkat, až poprvé ve svém životě RStudio otevřete. Nuže, není na co čekat, klikněme společně na jeho ikonu a přesuňme se k další lekci, ve které se s tímto vývojovým prostředím seznámíme.

Mac OS X

Programovací jazyk R v současnosti nejaktuálnější verzi 4.0.0 si můžete zdarma stáhnout kliknutím na následující logo. Instalace není záludná, proto ji snad netřeba podrobně popisovat. Úvodní nastavení v rámci instalačního procesu nemusíme měnit.

Tím ale práce nekončí. Ke spokojenosti nám totiž bude scházet stáhnout tzv. vývojové prostředí pod názvem RStudio (je též zdarma), ve kterém budeme reálně pracovat. To nám práci s programovacím jazykem v mnohém velmi zjednoduší a po uživatelské stránce zpříjemní. Práce v R bez RStudia není příliš přívětivá. Rozdíl tu naleznete jako mezi Favoritem a novým Porsche. Obě auta Vás s jistou dávkou pravděpodobnosti sice dovezou do kýženého cíle, kvalita jízdy však bude nesrovnatelná. Na druhé straně nesmíme zapomenout, že RStudio bez nainstalovaného R bude fungovat obdobně jako auto bez benzínu. Jinými slovy R bez RStudia spustit lze, opačně ale nikoliv.

Jak pevně doufám, vše je nainstalováno a již se určitě nemůžete dočkat, až poprvé ve svém životě RStudio otevřete. Nuže, není na co čekat, klikněme společně na jeho ikonu a přesuňme se k další lekci, ve které se s tímto vývojovým prostředím seznámíme.

Linux

Programovací jazyk R v současnosti nejaktuálnější verzi 4.0.0 si můžete zdarma stáhnout kliknutím na následující logo. Instalace není záludná, proto ji snad netřeba podrobně popisovat. Úvodní nastavení v rámci instalačního procesu nemusíme měnit.

Tím ale práce nekončí. Ke spokojenosti nám totiž bude scházet stáhnout tzv. vývojové prostředí pod názvem RStudio (je též zdarma), ve kterém budeme reálně pracovat. To nám práci s programovacím jazykem v mnohém velmi zjednoduší a po uživatelské stránce zpříjemní. Práce v R bez RStudia není příliš přívětivá. Rozdíl tu naleznete jako mezi Favoritem a novým Porsche. Obě auta Vás s jistou dávkou pravděpodobnosti sice dovezou do kýženého cíle, kvalita jízdy však bude nesrovnatelná. Na druhé straně nesmíme zapomenout, že RStudio bez nainstalovaného R bude fungovat obdobně jako auto bez benzínu. Jinými slovy R bez RStudia spustit lze, opačně ale nikoliv.

Jak pevně doufám, vše je nainstalováno a již se určitě nemůžete dočkat, až poprvé ve svém životě RStudio otevřete. Nuže, není na co čekat, klikněme společně na jeho ikonu a přesuňme se k další lekci, ve které se s tímto vývojovým prostředím seznámíme.

Column

Příklady

Příklad 1

Programovat v jazyce R se naučíte nejlépe tak, že budete neustále experimentovat, vytvářet si své vlastní příklady a záludné úkoly. Přitom se přiučíte nejen novým příkazům, které si i lépe zažijete, ale hlavně se též naučíte řešit problémy s pomocí různých diskusních fór jako např. Stack Overflow, což je totiž klíčová dovednost každého programátora.

Cesta za RStudiem

Column

Vídeň: Cesta za RStudiem

Teoretické krůčky v RStudiu

Doma v Česku jsme toho kromě instalace příliš mnoho nepředvedli, proto se přesuňme do Vídně. Ta je známa především svojí překrásnou architekturou, která je stejně tak úžasná a elegantní jako podoba RStudia. V něm nalezneme čtyři základní panely, které si nyní ve stručnosti představíme (viz obrázek). V případě, že byste v následujících několika odstavcích něčemu nerozuměli, nepropadejte prosím žádné panice. Ve druhé části této lekce na nás totiž čekají praktické příklady, na kterých si vše jednoduše ukážeme. Pojďme na to!

Konzole

Obecně lze příkazy do R zapisovat dvěma různými způsoby. Tím prvním je konzole (levý dolní panel) a tím druhým je skript (levý horní panel). Zaměřme se v tuto chvíli pouze na konzoli, kterou lze nazvat takovým mozkem, srdcem a plícemi eRka zároveň. Konzole totiž uchovává veškeré příkazy, které jsme kdy v R úspěšně i neúspěšně spustili. Samozřejmě jen do té doby, než se rozhodneme RStudio zavřít a opětovně otevřít. Z podstaty fungování konzole proto nelze již jednou spuštěné příkazy v ní nijak upravovat jako v běžném textovém editoru.

Výše uvedený odstavec zněl poněkud neprakticky, co říkáte? Až tak hrozné to však není. Chceme-li totiž nějaký příkaz přímo v konzoli upravit, stačí ho napsat a spustit znovu. To sice zní už o trochu lépe, ale přesto tu k dokonalosti stále něco chybí. Je vážně nutné například kvůli drobné chybě v zápisu kódu tento příkaz zdlouhavě opisovat či kopírovat? Jistěže není. RStudio nabízí funkci, pomocí které stisknutím horní (respektive dolní) šipky na klávesnici postupně zobrazíme veškeré předchozí proběhlé příkazy, jež můžeme následně upravovat a opětovně spouštět.

Konzoli budeme využívat zejména pro vytváření jednoduchých příkazů, jelikož na rozdíl od skriptu nevyžaduje při spuštění kódu nic víc než zmáčknutí enteru. Pro vytváření složitějších (víceřádkových) kódů se však konzole nepoužívá. A to už jenom z toho důvodu, že byste si takový kód nemohli uložit, což by jistě byla věčná škoda. Přesuňme proto nyní naši pozornost směrem ke skriptu.

Skript

Pokud napíšeme příkaz do skriptu (panel vlevo nahoře), nevyhodnotí se po stisknutí enteru, ale teprve až po kliknutí na tlačítko run či source. Do té doby skript funguje jako textový editor (respektive poznámkový blok). Pokud chceme spustit celý kód ve skriptu najednou (vše co v něm máme napsáno), stačí kliknout na tlačítko source. Chceme-li však spustit pouze určitou část skriptu, musíme ji modře přetáhnout myší a poté kliknou na tlačítko run (viz modrý obdélník na následujícím obrázku).

Levý horní panel má však ještě další využití a tím je zobrazování dat ve formátu přehledné tabulky. Budeme-li se chtít podívat na určitá data, která jsme v R vytvořili či si je do něj stáhli (například ve formátu txt, csv, xlsx atd.), budeme se dívat právě na tento panel, který obsahuje záložky podobně jako webový prohlížeč (viz červený obdélník na předchozím obrázku). V neposlední řadě budeme v tomto levém horním panelu tvořit webové stránky a PDF dokumenty s našimi výstupy z R. Tímto tématem se však budeme zabývat až v osmé kapitole.

Proměnné

V R budeme pracovat s mnoha různými proměnnými. Abychom si jejich názvy nemuseli pamatovat, budeme je vidět v pravém horním panelu. V něm navíc nalezneme mnoho dalších užitečných informací o formátu těchto dat. O nich však později ve druhé kapitole.

Grafy, nápověda & další

V pravém dolním rohu se budeme potkávat nejenom s grafy (záložka Plots), ale i s nápovědou (záložka Help) a adresářem (záložka Files), se kterým si nyní vůbec nemusíte lámat hlavu. Prozatím postačí, že jste o něm slyšeli. Co se týče grafů, těm se budeme podrobně věnovat v páté kapitole, kterou započneme v daleké Nairobi. Do ní je však z Vídni daleko, a proto zůstaňme ještě chvíli tu ve střední Evropě.

Úvodní proslov k RStudiu máme za sebou. Co podstatného bychom si z něho měli odnést? Pro začátek doporučuji zapisovat příkazy přímo do konzole. Nebudeme tudíž muset neustále přehmatávat z klávesnice na myš, označovat příkazy ve skriptu a klikat na tlačítko run či source. Volba je však čistě na vás. V každém případě si ale v této lekci vyzkoušíme obojí. Pouze ještě doplním, že skript můžeme vytvořit tak, že klikneme na záložku File > New File > R Script (nebo použijeme klávesovou zkratku Ctrl + Shift + N). První skript máme nicméně automaticky spuštěný již při otevření RStudia. Jeho uložení provedeme tak, že klikneme na File > Save As a následně uvedeme požadovaný název souboru. Žádnou koncovku k němu přidávat nemusíme, jelikož se koncovka .R k dokumentu připojí automaticky.

Praktické krůčky v RStudiu

Teorii máme za sebou, pojďme se proto podívat na praktické příklady. Pro začátek si vytvoříme proměnnou, která bude obsahovat jednu hodnotu, v našem případě číslo jedna. Na ní si blíže představíme všechny čtyři panely RStudia. Následující příkaz prosím zapište do konzole a stiskněte enter.

x <- 1
# Příkazy uvedené v tomto kurzu budou zobrazeny vždy 
# v takovémto ohraničení s modrofialovým pruhem vlevo.

V našem prvním příkazu jsme vytvořili proměnnou s názvem x a k ní přiřadili hodnotu jedna. Symbol zobáčku s pomlčkou <- (klávesová zkratka Alt + pomlčka) by šel přeložit i jako rovná se, nicméně prosté rovnítko nepoužívejte, i když by takový příkaz rovněž fungoval (x = 1). Rovnítka totiž budeme používat uvnitř jednotlivých příkazů. Stejný příkaz by bylo možné zapsat dokonce ještě jedním způsobem, a tím je 1 -> x. Takovýto styl zápisu však též raději nepoužívejte, jelikož by zhoršoval čitelnost a přehlednost vašeho kódu. Na závěr je nutné ještě podotknout, že R je citlivé na velká a malá písmena. Pokud bychom napsali příkaz X <- 1 (s velkým X), vytvoříme úplně novou proměnnou, která nebude nijak závislá na předchozí proměnné malé x.

Box: Názvy proměnných

Jméno proměnné se může skládat z písmen, číslic, teček a podtržítek. Musí ale začínat písmenem nebo tečkou, za kterou nenásleduje číslice (tj. x.1 <- 1 lze, x1 <- 1 též, nemluvě o .x <- 1, ale .1 <- 1 už hlásí chybu, stejně jako 1x <- 1).

Naše první proměnná x je na světě. O tom svědčí i pravý horní panel, který nám tuto hodnotu již zobrazuje. Podívejme se na něj.

Pokračujme dále a do konzole zapišme další příkaz. Tentokrát se bude jednat o samotné písmeno x. Po spuštění tohoto příkazu se nám v konzoli objeví číslo jedna, tj. hodnota, která byla proměnné x přiřazena. Po zapsání pouhého příkazu x <- 1 se hodnota do konzole nevypíše, pouze se příkaz v R provede. Chceme-li proto hodnoty z proměnné do konzole vypsat, musíme do ní zapsat příkaz, jenž bude obsahovat název proměnné. (Pozn.: Pro upřesnění ještě uvedu, že výstupy příkazů do konzole budou v tomto kurzu uváděny vždy hned pod samotný příkaz, viz níže.)

x
[1] 1

Vypsat hodnotu proměnné do konzole lze velice jednoduše. Existují tu však i další způsoby, kterými lze stejného výsledku dosáhnout. Podívejme se proto na další modrý (pro někoho fialový) box.

Box: VYPSÁNÍ HODNOTY PROMĚNNÉ DO KONZOLE

Implicitní způsob

Implicitní způsob vypsání hodnoty proměnné do konzole znamená, že do konzole zapíšeme název dané proměnné (v našem případě x).

x <- 1
x
[1] 1

Explicitní způsob

Explicitní způsob vypsání hodnoty proměnné do konzole znamená, že použijeme příkaz print(), ve kterém do závorky uvedeme název dané proměnné. Tento styl zápisu je doporučen zejména pro skripty. To však neznamená, že by implicitní způsob ve skriptu nefungoval. Spíše se tak jedná o zlepšení přehlednosti vašeho kódu (příkaz print() toho nicméně umí mnohem víc, o tom ale někdy příště).

x <- 1
print(x)
[1] 1

Při tvorbě proměnné

V případě, že své výtvory zapisujete přímo do konzole, můžete svůj příkaz vložit do závorky a výsledek se okamžitě vypíše na další řádek.

(x <- 1)
[1] 1

Prozatím jsme vytvořili proměnnou pouze s jednou hodnotou. Představte si však, že se chceme podívat na tabulku, která obsahuje třeba devět proměnných s dvěma sty pozorováními pro každou z nich (již nyní se můžete těšit na databázi Katan obsahující údaje o hráčích populární deskové hry Osadníci z Katanu). V takovém případě by nebylo příliš přehledné tyto data zobrazovat v konzoli. Z tohoto důvodu v R existuje příkaz View(), který nám proměnnou (databázi) zobrazí v levém horním panelu. Dávejte si prosím pozor na to, že se příkaz View() na rozdíl od drtivé většiny ostatních příkazů (srovnejte například s příkazem print()) píše s velkým počátečním písmenem.

View(x)
# Příkaz zobrazí tabulku s daty proměnné x, čímž se nám zde 
# vytvoří druhá záložka (ta první pod názvem Untitled1 označuje 
# skript, viz obrázek).

S proměnnou x chodí ruku v ruce vždy i proměnná y. Pojďme si tuto proměnnou též vytvořit, nyní pro změnu s pomocí skriptu. Stačí do něj vypsat následující dva příkazy a stisknout tlačítko source či přetáhnout myší oba řádky a kliknout na run, což je varianta, kterou já preferuji. Ve skriptu mám totiž častokrát uveden větší počet nesouvisejících příkazů.

y <- 2  
print(y) 
# Chceme-li do skriptu vepsat naše popisky, které nám například 
# budou říkat, co který kód znamená (jako právě nyní), použijeme 
# znak mřížky (#) a R takový text při spuštění daného skriptu 
# přeskočí.

Na výše uvedeném obrázku vidíme, že jsme skript spustili dvěma různými způsoby. V tom prvním jsme zvolili tlačítko source a v tom druhém run. V obou případech nám příkazy fungovaly naprosto stejně, přesto tu jedna drobná odlišnost existuje. Rozdíl se skrývá v zápisu příkazů do konzole. V prvním případě totiž v konzoli nevidíme přesné znění příkazu, jelikož v něm nalézáme pouhou hlášku: source(‘~/.active-RSTUDIO-document’). Ve druhém případě, v němž jsme použili run, se nám v konzoli zobrazily oba příkazy ze skriptu. Jinou odlišnost zde už ale nehledejte.

Odstupme na chvíli od skriptu a zaměřme se na další příklad. V něm budeme chtít změnit hodnotu proměnné x a přiřadit jí místo jedničky číslo tři. V takovém případě nám bude stačit do konzole vepsat následující pokyn.

x <- 3

Není tedy třeba proměnnou nejdříve mazat, jelikož stačí jednoduše vložit nový příkaz s novými hodnotami. Při tom můžeme využít i horní šipku na klávesnici, pomocí které se proklikáme na původní příkaz x <- 1, který následně upravíme dle libosti.

V průběhu času vás jistě bude napadat hromada otázek. Není tedy od věci se již v tuto chvíli seznámit s nápovědou. Tu lze vyvolat třemi různými způsoby. První možností je, že vejdete přímo do pravého dolního panelu, kliknete na záložku Help a do políčka pro vyhledávání zadáte název příkazu, který vás zajímá (například příkaz View). Zbývajícími variantami jsou následující dva typy zápisu, které lze zapsat ve formě eRkového příkazu. Výsledná nápověda se objeví stejně jako v prvním případě v pravém dolním panelu.

?View      # použijeme symbol otazníku doplněný o název příkazu
help(View) # další způsob pro zobrazení nápovědy

Na druhou stranu je na tomto místě nezbytné znovu zdůraznit, že hlavní nápovědou pro R je vyhledávač Google, respektive Stack Overflow, pomocí něhož získáte odpovědi na 90 % vašich otázek. Zbývající odpovědi nezískáte pouze z toho důvodu, že jste se špatně zeptali.

V tuto chvíli jsme si prakticky ukázali (ve velmi zjednodušené formě) celé prostředí RStudia. Jediné, co jsme si prozatím nepředstavili, jsou grafy, které by se měly zobrazovat též v pravém dolním panelu. Jelikož jste ale byli velice šikovní, zapište si za odměnu následující příkaz s názvem plot().

x <- 3
y <- 2
plot(x, y) 
# Na prvním místě příkazu plot definujeme body na x-ové ose, 
# na druhé pozici na y-ové ose.
# Jednotlivé proměnné se nicméně samozřejmě mohou jmenovat
# i jinak než x a y.

To je nádhera, co říkáte? Váš první graf v eRku. Jak ale možná cítíte, stále to ještě není úplně ono. Pojďme se proto přesunout do Milána, ve kterém se zaměříme na vektory. Před tím se však prosím ještě podívejte na příklady k procvičení. Řešení k těmto příkladům naleznete v závěrečné sekci této kapitoly s názvem Příklady.

Column

Příklady

Příklad 2

Vytvořte proměnnou s názvem Osadníci a přiřaďte jí hodnotu čtyři. Je možné vytvářet proměnné s českou diakritikou? Může mít název proměnné více slov, jako např. Osadníci z Katanu? Lze tento problém případně nějak vyřešit?

Příklad 3

Výše zmíněnou proměnnou Osadníci zobrazte v levém horním panelu. Jaký příkaz použijete?

Příklad 4

Jaká klávesová zkratka se používá pro symbol <- ?

Příklad 5

Vytvořte graf, který bude na y-ové ose obsahovat hodnotu deset a na x-ové ose hodnotu dvacet.

Příklad 6

Dokázali byste svému kamarádovi, který se též učí programovat v R, vlastními slovy popsat rozdíl mezi skriptem a konzolí?

Vektory

Column

Milán: Vektory

Úvod do vektorů

V předchozí lekci jsme se seznámili s prostředím RStudia. Nyní přichází čas pustit se do tvorby příkazů, které již budou o maličko komplikovanější a elegantnější nežli x <- 1. Z tohoto důvodu se přesouváme opět na jih, a to do hlavního města módy do Milána. Začneme tím, že se naučíme pracovat s vektory. Pod pojmem vektor si můžete představit řetězec (lze i jednočlenný) povětšinou nějakých čísel (např. známek z matematiky či dějepisu, zkrátka cokoliv), ale i písmen nebo slov. Z tohoto důvodu prosím nehledejte přímou paralelu s vektory, tak jak je znáte z matematiky či animovaného filmu Já, padouch.

V minulé kapitole jsme pracovali s proměnnými x a y, které obsahovaly vždy pouze jednu číslici. I tyto byly vektory. Práce s proměnnými, které obsahují jednu hodnotu (respektive jedno pozorování), však není příliš zábavná. Ukažme si tedy pro začátek alespoň jednoduchou číselnou posloupnost.

x <- 10:50  
# příkaz vytvoří proměnnou x s hodnotami od 10 do 50
 [1] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
[26] 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

Co se v R přihodilo? Dřívější hodnota proměnné x se změnila na hodnoty 10 až 50. Čísla na začátcích řádků v hranatých závorkách (výše uvedený výstup z konzole) odkazují na pořadí první hodnoty řádku ve vektoru x.

Nyní si na tomto místě dovolím drobnou technickou poznámku. Nezdá se vám na předchozím příkazu a jeho výstupu něco zvláštního? Pokud do konzole vypíšeme pouhý příkaz x <- 10:50, víme, že se nám vlastní hodnoty 10 až 50 v konzoli nezobrazí. Proto je nutné zapsat na další řádek příkaz ve formě názvu dané proměnné, v našem případě x. My však v našich skriptech, které jsou uváděny v tomto kurzu, takovýto typ příkazu pro lepší přehlednost a čitelnost uvádět nebudeme, a přesto pod něj budeme vypisovat výstup z konzole. K tomu ještě doplním, že je-li vaším cílem vypsat výsledek pouze do konzole a nevytvářet přitom žádnou proměnnou, stačí do ní uvést samotný příkaz 10:50. Vyzkoušejte.

10:50   
 [1] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
[26] 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

Pokračujme dalším úkolem. V něm si ukážeme, jak s pomocí příkazu c() vytvoříme proměnnou, která bude obsahovat několik různých na sebe přímo nenavazujících čísel.

x <- c(1, 6, 90, 95) # nelze zapsat ve tvaru x <- 1, 6, 90, 95
x <- c(1, c(6, c(90, 95))) # i takovýto styl zápisu lze použít
[1]  1  6 90 95
[1]  1  6 90 95

Vektor nemusí obsahovat pouze číslice, neboť může obsahovat i písmena a celá slova. Ty však na rozdíl od číslic musí být uvedeny uvnitř uvozovek či apostrofů.

x1 <- "Jakub"   
# s apostrofy x1 <- 'Jakub'
[1] "Jakub"

Chceme-li v proměnné více slov či jednotlivých písmen najedou, použijeme opět příkaz c(), tj. concatenate (concatenation znamená v angličtině zřetězení).

x2 <- c("Jakub", "David")   
[1] "Jakub" "David"

Pomocí příkazu c() lze spojovat nejenom čísla nebo písmena, ale též i samotné vektory.

x3 <- c(x1, x2) 
# příkaz zanechá pořadí jednotlivých hodnot z vektorů x1 a x2
[1] "Jakub" "Jakub" "David"

V R lze vytvořit dokonce i takový vektor, který bude obsahovat kombinaci písmen a číslic zároveň. Výsledný vektor se nicméně stane textovým, tj. s ním nebudeme moci provádět některé matematické operace, což asi nikoho nepřekvapí. Dokonce i samy číslice totiž mají v takovém vektoru formát textu, o čemž svědčí uvozovky, do kterých jsou čísla ve výstupu v konzoli vepsány (více o tzv. datových typech v příští kapitole).

x <- c(1, 5, "ano", "ne", "ano1", "ne5") 
[1] "1"    "5"    "ano"  "ne"   "ano1" "ne5" 

V případě, že vás proměnná x již omrzela a vy byste ji chtěli smazat, stačí do konzole vepsat následující příkaz rm().

rm(x)   
# Do závorky uvedeme název proměnné, kterou chceme smazat.
# Smazání se projeví tak, že proměnná zmizí z pravého 
# horního panelu.

Tvorba vektorové posloupnosti

Toužíte-li vytvořit číselný řetězec s určitým pravidlem, nebudeme ho vypisovat ručně jako doposud pomocí příkazu c(), jelikož použijeme vhodnější příkazy seq() a rep(). Ukažme si, co umí. Pro začátek nás bude zajímat, jak vytvořit proměnnou od jedné do sedmi, aniž bychom použili příkaz 1:7.

y <- seq(7)
[1] 1 2 3 4 5 6 7

V R je běžné, že mnoho úkonů lze provést se stejným výsledkem mnoha různými způsoby. Jak ale vytvořit příkaz, který bude obsahovat čísla od jedné do tří navýšená vždy například o 1/2? K tomu bude nutné použít následující o trochu složitější formu příkazu seq().

y <- seq(from = 1, to = 3, by = 1/2)    
# Všimněte si desetinných teček ve výstupu v konzoli, 
# v R se totiž desetinná čárka nepoužívá.
[1] 1.0 1.5 2.0 2.5 3.0

Zastavme se na chvíli u tohoto příkazu a seznamme se s novým eRkovým termínem parametr, jímž máme na mysli příkaz uvnitř příkazu. Výše uvedený příkaz seq() jsme modifikovali parametry from, to a by. Skutečnost, že každý příkaz obsahuje jeden a více parametrů nicméně neznamená, že je všechny musíme při zadávání příkazu definovat. Veškeré parametry totiž mají svoji základní hodnotu, která zůstává stále stejná, pokud ji aktivně nezměníme (např. seq(from = 1, to = 1, by = ((to - from)/(length.out - 1)), length.out = NULL, along.with = NULL, ...), viz nápověda). Parametry length.out a along.with proto zůstaly příkazem seq(from = 1, to = 3, by = 1/2) nezměněny (length.out si představíme za chvíli).

Parametry lze do příkazu uvádět dvěma základními způsoby. Uveďme si příklad. Příkaz seq(from = 1, to = 3, by = 1/2) by šlo zapsat též i ve zkráceném formátu seq(1, 3, 1/2). Tento druhý styl zápisu nicméně nelze obecně příliš doporučit, protože vy jako člověk na rozdíl od počítače můžete velice jednoduše ztratit přehled o tom, kde se jaký parametr, na jaké pozici nachází.

Další nevýhodou je i to, že pokud byste chtěli v příkazu změnit parametr, který je defaultně nastaven např. na třetí pozici, museli byste do příkazu uvést hodnoty i pro první dva, které třeba vůbec měnit nechcete (zjednodušeně řečeno, protože tento problém je trochu složitější, viz např. seq(7)). U prvního stylu zápisu však stačí uvést pouze takové parametry, které chcete přepsat z výchozích hodnot. V rámci prvního způsobu je navíc jedno, jestli napíšete seq(from = 1, to = 3, by = 1/2) nebo parametry přeskupíte a napíšete seq(by = 1/2, to = 3, from = 1). Jistě, u tohoto příkazu nedává přeskupení valný smysl, jelikož from, to, by zde mají určitou logickou posloupnost. V dalších příkazech nicméně parametry nemusí vytvářet přímou návaznost, a proto je budeme často psát v různém pořadí.

Následující příklad, který si zde ukážeme, si klade za cíl vytvořit posloupnost ve tvaru od do s předem určeným počtem hodnot. V něm využijeme výše slíbený parametr length.out.

y <- seq(from = 1, to = 7, length.out = 6)  
[1] 1.0 2.2 3.4 4.6 5.8 7.0

V nadcházející části této lekce se zaměříme na příkaz rep(). Ten nám například umožní vytvořit vektor o deseti jedničkách, aniž bychom tyto čísla museli ručně vypisovat.

y <- rep(1, times = 10)     
 [1] 1 1 1 1 1 1 1 1 1 1

Opakovat nemusíme pouze jedno, ale i více číslic najednou.

y <- rep(c(1, 3), times = 10)   
 [1] 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3
y <- rep(1:3, times = 5) 
 [1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3

Nejenom čísla, ale i celá slova můžeme opakovat pomocí příkazu rep().

y <- rep("Jakub", times = 2)        
[1] "Jakub" "Jakub"

A co si takhle předvést něco složitějšího? Zkusme nyní vytvořit sekvenci čísel od jedné do sedmi, která bude obsahovat čísla navýšená vždy o 1/3 a tuto sekvenci následně zopakovat třeba třikrát.

y <- rep(seq(from = 1, to = 7, by = 1/3), times = 3) 
 [1] 1.000000 1.333333 1.666667 2.000000 2.333333 2.666667 3.000000 3.333333
 [9] 3.666667 4.000000 4.333333 4.666667 5.000000 5.333333 5.666667 6.000000
[17] 6.333333 6.666667 7.000000 1.000000 1.333333 1.666667 2.000000 2.333333
[25] 2.666667 3.000000 3.333333 3.666667 4.000000 4.333333 4.666667 5.000000
[33] 5.333333 5.666667 6.000000 6.333333 6.666667 7.000000 1.000000 1.333333
[41] 1.666667 2.000000 2.333333 2.666667 3.000000 3.333333 3.666667 4.000000
[49] 4.333333 4.666667 5.000000 5.333333 5.666667 6.000000 6.333333 6.666667
[57] 7.000000

Pomocí rep() lze zopakovat jednotlivá čísla nikoliv pouze najednou, ale též i postupně.

y <- rep(2:5, each = 3) 
 [1] 2 2 2 3 3 3 4 4 4 5 5 5

A co takhle využít parametry times a each současně?

y <- rep(1:6, each = 2, times = 2)      
 [1] 1 1 2 2 3 3 4 4 5 5 6 6 1 1 2 2 3 3 4 4 5 5 6 6

Stejně jako u sekvencí, lze i u replikací předem stanovit délku řetězce s pomocí parametru length.out.

y <- rep(-1:3, length.out = 10) 
# všimněte si mínusu
 [1] -1  0  1  2  3 -1  0  1  2  3
y <- rep(c(1, 3), length.out = 5)  
[1] 1 3 1 3 1

V rámci příkazu rep() není ani žádný problém pracovat s písmeny místo číslic. Podívejme se na následující dva příkazy.

y <- letters[rep(2:5, times = 3)]   
# Pokud chceme místo čísel písmena, vložíme výraz 
# do hranatých závorek a napíšeme před ní letters.
 [1] "b" "c" "d" "e" "b" "c" "d" "e" "b" "c" "d" "e"
y <- append(10:15, letters[1:4], after = 4) 
# vložení vektoru do vektoru
 [1] "10" "11" "12" "13" "a"  "b"  "c"  "d"  "14" "15"

S příkazy rep() a seq() bychom si mohli hrát ještě dlouho, nám však tento úvod naprosto stačí. Pojďme se proto vrhnout do závěrečné části této lekce.

Tvorba náhodného vektoru

Prozatím jsme se naučili vytvářet vektory, které byly nenáhodné a přesně definované. Co když ale budeme chtít vytvořit zcela náhodný vektor? Jinými slovy, co když si budeme chtít zahrát Člověče nezlob se a po ruce zrovna nebudeme mít kostku, ale RStudio? Naprosto běžná záležitost. Podívejme se proto na následující příkaz sample(), který nám problém s kostkou a večerním programem (například v době koronavirové pandemie) vyřeší.

kostka <- sample(6, size = 20, replace = TRUE)      
# příkaz simuluje 20 hodů kostkou
# parametr replace umožní, aby se čísla mohla opakovat
 [1] 3 5 1 3 2 1 5 1 5 1 1 6 1 4 2 1 6 5 6 2

Dokázali byste uhodnout, co se stane, pokud do parametru replace uvedeme FALSE? Vyzkoušejte sami. Bude to červené a obvykle to nebudete mít příliš rádi. Jedná se o error. Nelze totiž z pochopitelných důvodů házet dvacetkrát kostkou a přitom zabezpečit, že se nám hodnoty nebudou opakovat.

Error in sample.int(x, size, replace, prob): cannot take a sample larger than the population when ‘replace = FALSE’

Hlášku erroru je dobré si vždy přečíst, jelikož nám obvykle dokáže velmi dobře poradit, co je v našem skriptu špatně a co bychom měli opravit.

Jste statistik a máte chuť vytvořit si náhodnou proměnnou z normálního rozdělení? Vyzkoušejte si příkaz rnorm(). K tomu si navíc můžete prostudovat nápovědu help(rnorm), máte-li zájem se o něm dozvědět víc. My ostatní se nicméně vydáme vstříc další lekci, která nás naučí vybírat hodnoty z již existujících proměnných (v našem případě prozatím pouze z vektorů). Čeká nás Barcelona.

rnorm(7)  
# sedm náhodných čísel z normálního rozdělení
# defaultně střední hodnota = 0, směrodatná odchylka = 1
# rnorm(n, mean = 0, sd = 1)
[1]  1.5081057  1.1993492 -2.1467315  0.7022742 -0.1729249  0.2585290 -0.2920936

Column

Příklady

Příklad 7

Vytvořte proměnnou s názvem desítka, která bude obsahovat hodnoty od jedné do deseti, které se budou postupně navyšovat o 1/4 (tj. 1; 1,25; 1,5 atd.).

Příklad 8

Vytvořte proměnnou s názvem dvacítka, která bude obsahovat celkově dvacet hodnot mezi jedničkou a stovkou rovnoměrně rozprostřených v tomto rozmezí.

Příklad 9

Vytvořte proměnnou s názvem třicítka, která bude obsahovat sekvenci třiceti jedniček a nul (tj. 0, 1, 0, 1 atd.).

Příklad 10

Vytvořte proměnnou čtyřicítka, která bude obsahovat hodnoty mezi jedničkou a trojkou, které se budou navyšovat vždy o 1/3 a tuto sekvenci následně zopakujte čtyřicetkrát.

Příklad 11

Vytvořte program na hod dvěma kostkami (například pro deskovou hru Osadníci z Katanu). Program by se měl jmenovat Kostka a měl by být spustitelný tlačítkem source. Výsledný program uložte na svůj počítač.

Příklad 12

Vytvořte proměnnou s názvem statistik, vložte do ní tisíc hodnot z normálního rozdělení se střední hodnotou dva a směrodatnou odchylkou též dva. Výsledek vykreslete do grafu.

Subvektory

Column

Barcelona: Subvektory

Výběr barcelonských fotbalistů patří dlouhodobě mezi ty nejlepší na celém světě. Proto i my bychom se měli naučit vytvářet takové výběry, se kterými budeme náležitě spokojeni, i když se v našem případě bude jednat pouze o vektory. Když už totiž máme určitý vektor vytvořený, budeme nezřídka kdy potřebovat vybrat z něj pouze určitou jeho část. Třeba jen jeho druhý prvek, který jsme se zrovna rozhodli vystřídat jiným číslem či písmenem. Jak takový subvektor vytvořit, tak se totiž odborně výběru z vektoru říká, se naučíme právě nyní v Barceloně za pomoci hranatých závorek. Před tím si však vytvořme novou proměnnou x.

x <- 11:16 
# vektor pro práci s nadcházejícími příklady
[1] 11 12 13 14 15 16

Máte-li proměnnou vytvořenou, zkuste do konzole zapsat následující příkaz. Ten bude začínat názvem vektoru, ze kterého budeme hodnoty vybírat a následně pokračovat hranatou závorkou s číslem pozice dané hodnoty, kterou chceme vybrat (v našem případě se bude jednat o druhou pozici ve vektoru x).

x[2]    
# příkaz vypíše druhou pozici proměnné x 
[1] 12

Jednoduché, co říkáte? A co když budeme chtít vybrat hodnoty na pozici číslo jedna a pět, respektive jedna až pět?

x[c(1, 5)]  
# příkaz vypíše první a pátou pozici proměnné x 

x[1:5]  
# příkaz vypíše všechny hodnoty od 1. do 5. pozice ve vektoru
[1] 11 15
[1] 11 12 13 14 15

Pochopení principu výše uvedeného příkazu x[c(1, 5)] je velice podstatné pro další práci v R, proto se u něj na chvíli zastavme. V příkazu vidíme jak hranaté, tak i kulaté závorky. Co to znamená? Z vektoru x vybíráme určité hodnoty, proto volíme hranaté závorky. Při tom chceme vybrat hodnoty na první a páté pozici, z toho důvodu volíme příkaz c(), v němž jsou závorky jako u všech příkazů naopak kulaté. Zápis není složitý. Je však podstatné pochopit základní rozdíl mezi hranatou závorkou, jež je spojena s výběrem hodnot z proměnné, před kterou je vytknut název proměnné a kulatou závorkou, která bývá povětšinou spojena s určitým příkazem (popřípadě parametrem) vytknutým před ní (najdou se nicméně i drobné výjimky, viz příkaz letters[]).

Následující úkol bude oproti těm předcházejícím o maličko komplikovanější, jelikož budeme chtít z vektoru x vybrat veškeré hodnoty, které jsou menší nebo rovno dvanácti.

x[x <= 12]  
# příkaz vypíše všechny hodnoty proměnné x menší nebo rovno 12 
[1] 11 12

U předchozího příkazu si prosím uvědomme, že nevybíráme pozice 1 až 12 (pozici nula zde v R nemáme, na rozdíl například od programovacího jazyka Python), ale samotné hodnoty uvnitř vektoru, které splňují podmínku x <= 12.

Chceme-li výběr našich hodnot z vektoru x přiřadit do nové proměnné, například y, použijeme následující velice jednoduchý zápis, který vás jistě nepřekvapí.

y <- x[x <= 12]     
# Příkaz vytvoří proměnnou y, která bude obsahovat všechny 
# hodnoty z proměnné x, které jsou menší nebo rovno 12.
[1] 11 12

Doposud jsme se naučili hodnoty z vektoru pouze vybírat a tento výběr přesouvat do jiné proměnné. Stále tudíž nevíme, kterak lze změnit hodnoty uvnitř samotného vektoru. Postupovat budeme obdobně jako kdybychom vytvářeli novou proměnnou. Pouze na levé straně nebude stát název nové proměnné, ale námi zvolený výběr, třeba čtvrtá hodnota z vektoru x.

x[4] <- 14      
# v pořadí 4. hodnotu vektoru x nahradíme číslem 14

x[c(1, 6)] <- c(90, 80) 
# hodnotám x na 1. a 6. pozici přiřadíme nové hodnoty 90 a 80

Máte-li ve všem jasno, můžeme bez obav pokračovat dál a podívat se na závěr této lekce, ve kterém se blíže seznámíme s problematikou závorek.

Box: Se závorkami a bez

Zapište si prosím následující dva kratičké skripty a přitom se podívejte na jejich rozdíly v zápisu a ve výstupu.

# 1. příklad 
x <- 11:16
y <- x[x <= 13]
print(y)
[1] 11 12 13
# 2. příklad 
x <- 11:16
y <- x <= 13
print(y)
[1]  TRUE  TRUE  TRUE FALSE FALSE FALSE

Příkaz x <= 13 vytváří logický vektor TRUE a FALSE (jedná se o datový typ, se kterým se seznámíme v následující kapitole). Výsledkem tudíž nebudou samotné hodnoty, jelikož k těm se dostaneme pouze skrze hranaté závorky. TRUE znamená, že podmínka x <= 13 byla splněna. Z tohoto důvodu příkaz x[x <= 13] vybere pouze ty hodnoty, jež splňují podmínku. Podmínkám se budeme blíže věnovat v Limě (3. kapitola).

Column

Příklady

Příklad 13

Vytvořte proměnnou x2, která bude obsahovat pouze prvních pět hodnot z proměnné x <- 2:20.

Příklad 14

V proměnné x (x <- 2:20) změňte hodnotu na páté pozici za číslo padesát.

Příklad 15

V proměnné x (x <- 2:20) vyberte posledních šest hodnot a vytvořte z nich proměnnou Konec. K řešení tohoto příkladu použijte příkaz length(), pomocí kterého zjistíte počet prvků (hodnot) ve vektoru.

Příklad 16

V proměnné x (x <- 2:20) změňte hodnoty na předposledním a posledním místě na 190 a 200. Předpokládejte však, že nevíte, jak je vektor x dlouhý a kolik prvků tedy obsahuje. Opět využijete příkaz length().

Příklad 17

Vytvořte proměnnou, která bude obsahovat každé sudé číslo mezi dvojkou až stovkou a z této proměnné vytvořte proměnnou s názvem výběr, která bude obsahovat veškerá čísla menší než 50.

Příklad 18

Vytvořte vektor Jména ve tvaru Jakub a David, který bude obsahovat 100 těchto zcela náhodně uspořádaných jmen.

Matematika 0

Column

Coimbra: Matematika 0

První stupeň základní školy

Úvod do vektorů je za námi, posuňme se proto o další kousek dál a to do Coimbry, ve které leží jedna z nejstarších univerzit na světě. Se záplavou vědomostí to však nebudeme příliš přehánět, jelikož se zaměříme pouze na základní matematické operace, které nás budou provázet po celou dobu našeho studia. Začneme jako na základní škole a to sčítáním, odečítáním, násobením a dělením.

Drazí studenti, zaveďme si tři proměnné x, y, z a s nimi počítejme.

x <- 1:5; y <- 1:8; z <- c(0, 2, 4, 6, 8) 
# Pokud chceme zapsat více příkazů do konzole v jednom 
# řádku, viz zadání příkladu, použijeme středník.

Chceme-li připočíst určité číslo ke všem číslům z vektoru, použijeme následující zápis příkazu.

x <- 1:5
q <- x + 2
[1] 3 4 5 6 7

Odečítání funguje obdobně.

x <- 1:5
q <- x - 2  
[1] -1  0  1  2  3

Sčítat můžeme i samotné vektory.

x <- 1:5; z <- c(0, 2, 4, 6, 8) 
q <- x + z  
[1]  1  4  7 10 13

A opět je můžeme stejně tak i odečítat.

x <- 1:5; z <- c(0, 2, 4, 6, 8) 
q <- x - z
[1]  1  0 -1 -2 -3

V případě, že se sčítají (odečítají) dvě nestejně dlouhé proměnné, kratší proměnná (x) se začne opakovat. Uplatňuje se zde tzv. recycling rule.

# nestejné délky vektorů
x <- 1:5; y <- 1:8
q <- x + y 
[1]  2  4  6  8 10  7  9 11
# nestejné délky vektorů
x <- 1:5; y <- 1:8
q <- x - y 
[1]  0  0  0  0  0 -5 -5 -5

Násobení funguje na podobném principu jako sčítání a odečítání. Ukažme si opět různé kombinace násobení vektorů různých délek.

x <- 1:5
q <- x * 2 
[1]  2  4  6  8 10
x <- 1:5; z <- c(0, 2, 4, 6, 8) 
q <- x * z 
[1]  0  4 12 24 40
# nestejné délky vektorů
x <- 1:5; y <- 1:8
q <- x * y
[1]  1  4  9 16 25  6 14 24

A stejně tak i dělení.

x <- 1:5
q <- x / 2 
[1] 0.5 1.0 1.5 2.0 2.5
x <- 1:5; z <- c(0, 2, 4, 6, 8) 
q <- x / z 
[1]       Inf 1.0000000 0.7500000 0.6666667 0.6250000
# nestejné délky vektorů
x <- 1:5; y <- 1:8 
q <- x / y
[1] 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 0.1666667 0.2857143
[8] 0.3750000

Je vám logika sčítání, odečítání, násobení a dělení různě dlouhých vektorů jasná? Pojďme dál.

Druhý stupeň základní školy

Matematika zahrnuje nejenom prosté sčítání, odečítání, násobení a dělení. Podívejme se tudíž i na učivo druhého stupně základní školy.

Box: Desetinný rozvoj

V některých případech se můžeme v R setkat s následujícími zápisy čísel. Ničeho se však nebojte, nejedná se o nic komplikovaného a ve své podstatě ani častého.

1.3e3
[1] 1300
2.7e-03
[1] 0.0027

Zaveďme si proměnné x, z a s nimi počítejme.

x <- 1:5; z <- c(0, 2, 4, 6, 8)

Mocniny, odmocniny, ale i dělení beze zbytku se nám v naší práci může někdy hodit.

x <- 1:5
x^2 
# mocnina (respektive odmocnina přes zlomek x^(1/2))
[1]  1  4  9 16 25
sqrt(x)
# druhá odmocnina
[1] 1.000000 1.414214 1.732051 2.000000 2.236068
x <- 1:5; z <- c(0, 2, 4, 6, 8)
x%/%z   
# dělení beze zbytku
[1] Inf   1   0   0   0
x <- 1:5; z <- c(0, 2, 4, 6, 8)
x%%z    
# zbytek po dělení
[1] NaN   0   3   4   5

Nezapomeňme však ani na průměr či příkaz suma, který nám zjistí součet všech hodnot v proměnné.

x <- 1:5
mean(x) 
# průměr vektoru x
[1] 3
x <- 1:5
sum(x) 
# součet všech hodnot v proměnné x
[1] 15

Box: Suma

x <- 1:5
sum(x) 
# součet všech hodnot v proměnné x
[1] 15
x <- 1:5
sum(x > 2) 
# Příkaz zjistí, kolik hodnot v proměnné x je > 2,
# tj. nikoliv jejich součet.
[1] 3
x <- 1:5
sum(x[x > 2]) 
# příkaz sečte hodnoty vektoru x, které jsou větší než 2 
[1] 12

Pamatujete si ze školy na logaritmy? Vezměme si následující běžný příklad ze života. Vlastníte přebytečný jeden milion korun (pro vás jako studenta R je to pouze otázka času, pokud ho ještě nemáte) a vložíte jej do banky s bohužel mizerným úrokem 1 %. V jakém roce se můžete těšit na zdvojnásobení vašich úspor?

Znáte-li pravidlo sedmdesáti, budete vědět, že při ročním úroku 1 % se vám hodnota Vašich úspor zdvojnásobí za přibližně sedmdesát let. S pomocí logaritmů však tento příklad vypočítáme naprosto přesně (69 let a 8 měsíců). Na druhou stranu si musíme uvědomit, že realita je bohužel mnohem horší. Budeme-li totiž počítat s průměrnou roční inflací 2 %, tak se nám za sedmdesát let naše bohatství nezdvojnásobí, ale naopak jeho hodnota bude o polovinu menší nežli dnes. Jak smutné.

1 000 000 x 1.01^n = 2 000 000, tj. 1.01^n = 2, tj. log1,01 2 = 69.66 let

# zdvojnásobení bohatství při nulové inflaci a 1 % úroku
log(2, 1.01)    

# poloviční bohatství při inflaci 2 % ročně a 1 % úroku
log(0.5, 0.9898)
# Proč 0.9898? 1 000 000 * 1.01 (úrok) * 0.98 (inflace) 
# = 98.98 % zbyde reálně z úspor.

# pozor na desetinnou tečku
[1] "zdvojnásobení bohatství při nulové inflaci a 1 % úroku"
[1] 69.66072
[1] "poloviční bohatství při inflaci 2 % ročně a 1 % úroku"
[1] 67.60844

Baví vás zaokrouhlování? Ne? I tak se podívejte na následující tři příkazy.

Zaveďme si novou proměnnou x a s ní počítejme.

x <- c(1.25, 1.5, 1.89) 
x <- c(1.25, 1.5, 1.89)
ceiling(x)  
# zaokrouhlení vektoru x nahoru
[1] 2 2 2
x <- c(1.25, 1.5, 1.89)
floor(x)    
# zaokrouhlení vektoru x dolů
[1] 1 1 1
x <- c(1.25, 1.5, 1.89)
round(x, digits = 1)    
# zaokrouhlení vektoru x k nejbližšímu celému číslu
# Parametrem digits = n volíme počet desetinných míst, 
# implicitně digits = 0.
[1] 1.2 1.5 1.9

Jednotlivé příkazy (např. round(), seq(), View() atd.) obsahují různé parametry, kterými tyto příkazy můžeme různě modifikovat a upravovat, to již víme. Také jsme si už pověděli, že jednotlivé parametry lze v rámci příkazu zapisovat na různých pozicích (např. příkaz seq(from = 1, to = 3, by = 1/2) lze zapsat i ve tvaru seq(by = 1/2, from = 1, to = 3). Existuje tu však jedna výjimka a tou je název proměnné, která vstupuje jako zdroj dat do příkazu. Ten musí být uveden vždy na první pozici za závorkou. Příkaz round(x, digits = 2) nelze tudíž zapsat jako round(digits = 2, x).

A to byla poslední informace z první kapitoly. Pokud jste došli až sem, je nutné vás pochválit. Urazili jste totiž notný kus cesty, která nebyla jednoduchá. Nyní nás čeká přelet přes oceán, jelikož další lekce začíná v New Yorku.

Column

Příklady

Příklad 19

Vytvořte vektor x <- 1:100 a zjistěte součet všech jeho hodnot.

Příklad 20

Vytvořte vektor Rozdíl, který bude obsahovat rozdíl sumy druhé poloviny z předchozího vektoru x (x <- 1:100) a první poloviny téhož vektoru x.

Příklad 21

Zjistěte součet všech sudých a lichých hodnot z vektoru x (x <- 1:100) a dokažte, která část je větší.

Příklad 22

Vytvořte vektor s tisíci čísly z náhodného rozdělení (střední hodnota = 0, směrodatná odchylka = 10), ty zaokrouhlete na celá čísla a spočítejte jejich průměr.

Příklady

Column

Column

Příklady: řešení

Příklad 1

Programovat v jazyce R se naučíte nejlépe tak, že budete neustále experimentovat, vytvářet si své vlastní příklady a záludné úkoly. Přitom se přiučíte nejen novým příkazům, které si i lépe zažijete, ale hlavně se též naučíte řešit problémy s pomocí různých diskusních fór jako např. Stack Overflow, což je totiž klíčová dovednost každého programátora.

Příklad 2

Vytvořte proměnnou s názvem Osadníci a přiřaďte jí hodnotu čtyři. Je možné vytvářet proměnné s českou diakritikou? Může mít název proměnné více slov, jako např. Osadníci z Katanu? Lze tento problém případně nějak vyřešit?

Osadníci <- 4
Osadníci_z_Katanu <- 4
# s českou diakritikou nebývá problém

Osadníci
Osadníci_z_Katanu
# stačí použít podtržítko
[1] 4
[1] 4

Příklad 3

Výše zmíněnou proměnnou Osadníci zobrazte v levém horním panelu. Jaký příkaz použijete?

View(Osadníci)

Příklad 4

Jaká klávesová zkratka se používá pro symbol <- ?

alt + pomlčka
# funguje pouze v RStudiu

Příklad 5

Vytvořte graf, který bude na y-ové ose obsahovat hodnotu deset a na x-ové ose hodnotu dvacet.

x <- 20
y <- 10
plot(x, y)

# V případě, že chceme graf uložit jako obrázek, stačí kliknout na
# tlačítko Export v pravém dolním panelu.

Příklad 6

Dokázali byste svému kamarádovi, který se též učí programovat v R, vlastními slovy popsat rozdíl mezi skriptem a konzolí?

Skript

Pokud napíšeme příkaz do skriptu, nevyhodnotí se okamžitě, ale teprve až poté, co klikneme na tlačítko run. Zde však pozor! Skript se z podstaty věci obvykle neskládá pouze z jednoho, ale z více řádků. Pokud tedy chceme spustit celý kód najednou, musíme ho nejdříve přetažením myši označit (nebo jednoduše stisknout ctrl + a). Pokud toto neučiníme a klikneme na run, spustí se nám pouze ten řádek, kde nám bliká kurzor. Celý skript lze jednoduše editovat, jako bychom psali text do poznámkového bloku. Po každém spuštění skriptu (byť jen jeho části) se vždy každý spuštěný řádek propíše do konzole v levém dolním panelu.

Konzole

Konzole je taková historie všech již provedených příkazů, které jsme v R napsali. Jednou zapsaný příkaz tedy již nelze odstranit. Každý řádek konzole začíná zobáčkem (>). Poté, co jsme se svým příkazem spokojeni a chceme ho spustit, stačí kliknout na tlačítko enter a příkaz se okamžitě vyhodnotí (pokud u skriptu stiskneme enter, dostaneme se pouze na další řádek). V případě, že se rozhodneme předchozí příkaz editovat, musíme ho na rozdíl od skriptu napsat a spustit znovu. RStudio však nabízí funkci, ve které stačí klikat horní (dolní) šipkou na klávesnici a zobrazí se nám předchozí příkazy v konzoli, které již jednoduše upravovat lze.

Příklad 7

Vytvořte proměnnou s názvem desítka, která bude obsahovat hodnoty od jedné do deseti, které se budou postupně navyšovat o 1/4 (tj. 1; 1,25; 1,5 atd.).

desítka <- seq(from = 1, to = 10, by = 1/4) 
 [1]  1.00  1.25  1.50  1.75  2.00  2.25  2.50  2.75  3.00  3.25  3.50  3.75
[13]  4.00  4.25  4.50  4.75  5.00  5.25  5.50  5.75  6.00  6.25  6.50  6.75
[25]  7.00  7.25  7.50  7.75  8.00  8.25  8.50  8.75  9.00  9.25  9.50  9.75
[37] 10.00

Příklad 8

Vytvořte proměnnou s názvem dvacítka, která bude obsahovat celkově dvacet hodnot mezi jedničkou a stovkou rovnoměrně rozprostřených v tomto rozmezí.

dvacítka <- seq(from = 1, to = 100, by = 5) 
 [1]  1  6 11 16 21 26 31 36 41 46 51 56 61 66 71 76 81 86 91 96

Příklad 9

Vytvořte proměnnou s názvem třicítka, která bude obsahovat sekvenci třiceti jedniček a nul (tj. 0, 1, 0, 1 atd.).

třicítka <- rep(c(0, 1), length.out = 30)  
 [1] 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1

Příklad 10

Vytvořte proměnnou čtyřicítka, která bude obsahovat hodnoty mezi jedničkou a trojkou, které se budou navyšovat vždy o 1/3 a tuto sekvenci následně zopakujte čtyřicetkrát.

čtyřícítka <- rep(seq(from = 1, to = 3, by = 1/3), times = 40)  
  [1] 1.000000 1.333333 1.666667 2.000000 2.333333 2.666667 3.000000 1.000000
  [9] 1.333333 1.666667 2.000000 2.333333 2.666667 3.000000 1.000000 1.333333
 [17] 1.666667 2.000000 2.333333 2.666667 3.000000 1.000000 1.333333 1.666667
 [25] 2.000000 2.333333 2.666667 3.000000 1.000000 1.333333 1.666667 2.000000
 [33] 2.333333 2.666667 3.000000 1.000000 1.333333 1.666667 2.000000 2.333333
 [41] 2.666667 3.000000 1.000000 1.333333 1.666667 2.000000 2.333333 2.666667
 [49] 3.000000 1.000000 1.333333 1.666667 2.000000 2.333333 2.666667 3.000000
 [57] 1.000000 1.333333 1.666667 2.000000 2.333333 2.666667 3.000000 1.000000
 [65] 1.333333 1.666667 2.000000 2.333333 2.666667 3.000000 1.000000 1.333333
 [73] 1.666667 2.000000 2.333333 2.666667 3.000000 1.000000 1.333333 1.666667
 [81] 2.000000 2.333333 2.666667 3.000000 1.000000 1.333333 1.666667 2.000000
 [89] 2.333333 2.666667 3.000000 1.000000 1.333333 1.666667 2.000000 2.333333
 [97] 2.666667 3.000000 1.000000 1.333333 1.666667 2.000000 2.333333 2.666667
[105] 3.000000 1.000000 1.333333 1.666667 2.000000 2.333333 2.666667 3.000000
[113] 1.000000 1.333333 1.666667 2.000000 2.333333 2.666667 3.000000 1.000000
[121] 1.333333 1.666667 2.000000 2.333333 2.666667 3.000000 1.000000 1.333333
[129] 1.666667 2.000000 2.333333 2.666667 3.000000 1.000000 1.333333 1.666667
[137] 2.000000 2.333333 2.666667 3.000000 1.000000 1.333333 1.666667 2.000000
[145] 2.333333 2.666667 3.000000 1.000000 1.333333 1.666667 2.000000 2.333333
[153] 2.666667 3.000000 1.000000 1.333333 1.666667 2.000000 2.333333 2.666667
[161] 3.000000 1.000000 1.333333 1.666667 2.000000 2.333333 2.666667 3.000000
[169] 1.000000 1.333333 1.666667 2.000000 2.333333 2.666667 3.000000 1.000000
[177] 1.333333 1.666667 2.000000 2.333333 2.666667 3.000000 1.000000 1.333333
[185] 1.666667 2.000000 2.333333 2.666667 3.000000 1.000000 1.333333 1.666667
[193] 2.000000 2.333333 2.666667 3.000000 1.000000 1.333333 1.666667 2.000000
[201] 2.333333 2.666667 3.000000 1.000000 1.333333 1.666667 2.000000 2.333333
[209] 2.666667 3.000000 1.000000 1.333333 1.666667 2.000000 2.333333 2.666667
[217] 3.000000 1.000000 1.333333 1.666667 2.000000 2.333333 2.666667 3.000000
[225] 1.000000 1.333333 1.666667 2.000000 2.333333 2.666667 3.000000 1.000000
[233] 1.333333 1.666667 2.000000 2.333333 2.666667 3.000000 1.000000 1.333333
[241] 1.666667 2.000000 2.333333 2.666667 3.000000 1.000000 1.333333 1.666667
[249] 2.000000 2.333333 2.666667 3.000000 1.000000 1.333333 1.666667 2.000000
[257] 2.333333 2.666667 3.000000 1.000000 1.333333 1.666667 2.000000 2.333333
[265] 2.666667 3.000000 1.000000 1.333333 1.666667 2.000000 2.333333 2.666667
[273] 3.000000 1.000000 1.333333 1.666667 2.000000 2.333333 2.666667 3.000000

Příklad 11

Vytvořte program na hod dvěma kostkami (například pro deskovou hru Osadníci z Katanu). Program by se měl jmenovat Kostka a měl by být spustitelný tlačítkem source. Výsledný program uložte na svůj počítač.

Kostka <- sample(6, size = 20, replace = TRUE) + 
          sample(6, size = 20, replace = TRUE)      
 [1]  7 10  8  5  7  4  5  6 11  3  6 11  5  8  4  8  9  8  9  7

Příklad 12

Vytvořte proměnnou s názvem statistik, vložte do ní tisíc hodnot z normálního rozdělení se střední hodnotou dva a směrodatnou odchylkou též dva. Výsledek vykreslete do grafu.

statistik <- rnorm(1000, mean = 2, sd = 2)
plot(statistik)

Příklad 13

Vytvořte proměnnou x2, která bude obsahovat pouze prvních pět hodnot z proměnné x <- 2:20.

x <- 2:20
x2 <- x[1:5]    
[1] 2 3 4 5 6

Příklad 14

V proměnné x (x <- 2:20) změňte hodnotu na páté pozici za číslo padesát.

x <- 2:20
x[5] <- 50
x[5]
[1] 50

Příklad 15

V proměnné x (x <- 2:20) vyberte posledních šest hodnot a vytvořte z nich proměnnou Konec. K řešení tohoto příkladu použijte příkaz length(), pomocí kterého zjistíte počet prvků (hodnot) ve vektoru.

x <- 2:20
Konec <- x[(length(x)-5):length(x)]
[1] 15 16 17 18 19 20

Příklad 16

V proměnné x (x <- 2:20) změňte hodnoty na předposledním a posledním místě na 190 a 200. Předpokládejte však, že nevíte, jak je vektor x dlouhý a kolik prvků tedy obsahuje. Opět využijete příkaz length().

x <- 2:20   
x[c((length(x)-1), length(x))] <- c(190, 200)   
 [1]   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18 190 200

Příklad 17

Vytvořte proměnnou, která bude obsahovat každé sudé číslo mezi dvojkou až stovkou a z této proměnné vytvořte proměnnou s názvem Výběr, která bude obsahovat veškerá čísla menší než padesát.

x <- seq(from = 2, to = 100, by = 2)    
Výběr <- x[x < 50]  
 [1]  2  4  6  8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48

Příklad 18

Vytvořte vektor Jména ve tvaru Jakub a David, který bude obsahovat sto těchto zcela náhodně uspořádaných jmen.

Jména <- sample(c("Jakub", "David"), size = 100, replace = TRUE)    
  [1] "Jakub" "Jakub" "David" "David" "David" "Jakub" "Jakub" "David" "David"
 [10] "Jakub" "David" "David" "David" "Jakub" "Jakub" "David" "David" "Jakub"
 [19] "David" "Jakub" "Jakub" "Jakub" "David" "David" "David" "Jakub" "Jakub"
 [28] "David" "David" "Jakub" "Jakub" "David" "David" "Jakub" "Jakub" "David"
 [37] "Jakub" "Jakub" "Jakub" "David" "Jakub" "Jakub" "David" "David" "Jakub"
 [46] "Jakub" "Jakub" "Jakub" "David" "Jakub" "Jakub" "Jakub" "Jakub" "Jakub"
 [55] "David" "David" "David" "David" "David" "David" "Jakub" "David" "Jakub"
 [64] "Jakub" "Jakub" "David" "Jakub" "David" "David" "Jakub" "Jakub" "David"
 [73] "David" "David" "Jakub" "Jakub" "Jakub" "David" "Jakub" "David" "David"
 [82] "David" "David" "David" "Jakub" "Jakub" "Jakub" "Jakub" "David" "David"
 [91] "Jakub" "Jakub" "Jakub" "Jakub" "David" "David" "David" "David" "Jakub"
[100] "David"

Příklad 19

Vytvořte vektor x <- 1:100 a zjistěte součet všech jeho hodnot.

x <- 1:100  
sum(x)
[1] 5050

Příklad 20

Vytvořte vektor Rozdíl, který bude obsahovat rozdíl sumy druhé poloviny z předchozího vektoru x (x <- 1:100) a první poloviny téhož vektoru x.

x <- 1:100
x1 <- x[1:50]
x2 <- x[51:100]
s1 <- sum(x1)
s2 <- sum(x2)
Rozdíl <- s2 - s1
[1] 2500

Příklad 21

Zjistěte součet všech sudých a lichých hodnot z vektoru x (x <- 1:100) a matematicky dokažte, která část je větší.

x <- 1:100

sudá <- x[seq(from = 2, to = 100, by = 2)]
lichá <- x[seq(from = 1, to = 100, by = 2)]

sudá_suma <- sum(sudá)
lichá_suma <- sum(lichá)

Rozdíl <- sudá_suma - lichá_suma
[1] "součet sudých čísel"
[1] 2550
[1] "součet lichých čísel"
[1] 2500
[1] "rozdíl"
[1] 50
[1] "Sudá čísla ve vektoru x <- 1:100 jsou dohromady větší o 50."
[1] "1 vs 2; 3 vs 4 ... 99 vs 100; 50 dvojic"

Příklad 22

Vytvořte vektor s tisíci čísly z náhodného rozdělení (střední hodnota = 0, směrodatná odchylka = 10), ty zaokrouhlete na celá čísla a spočítejte jejich průměr.

Norm <- rnorm(1000, mean = 0, sd = 10)
mean(round(Norm))
[1] -0.153
[1] "Výsledky tohoto příkazu se budou pokaždé lišit."

Column